package org.luxor.commons.storage.client;

import org.luxor.commons.core.utils.DateUtils;
import org.luxor.commons.core.utils.StrKit;
import org.luxor.commons.core.utils.StringUtils;
import org.luxor.commons.storage.constant.StorageType;
import org.luxor.commons.storage.exception.StorageServiceException;

import java.util.Date;

/**
 * 文件存储基础服务
 *
 * @author Mr.yan @date 2019/12/15
 */
public abstract class AbstractStorageClient {
    /**
     * 文件路径
     *
     * @param storageType (0：本地磁盘 1：Minio 2：FastDfs 3：七牛  4：阿里云  5：腾讯云)
     * @param prefix      /tmp/file/data
     * @param fileName    background!300x200 【仅支持数字、字母、！、*】
     * @param suffix      .png
     * @return ${prefix}/2019-12-15/{fileName}_{storageType}_220319263.${suffix}
     */
    public String getFilePath(StorageType storageType, String prefix, String fileName, String suffix) {
        if (StringUtils.isBlank(suffix)) {
            suffix = "temp";
        }
        if (StringUtils.isNotBlank(fileName)) {
            fileName = fileName.replaceAll("[^a-z^A-Z^0-9^!^*]", "");
        }
        if (StringUtils.isBlank(fileName)) {
            fileName = StrKit.NONE;
        }
        String dateDir = DateUtils.format(new Date(), DateUtils.DATE_PATTERN);
        StringBuilder sb = new StringBuilder();
        if (StringUtils.isNotBlank(prefix)) {
            if (prefix.startsWith(StrKit.SLASH)) {
                sb.append(prefix).append(StrKit.SLASH);
            } else {
                sb.append(StrKit.SLASH).append(prefix).append(StrKit.SLASH);
            }
        }
        sb.append(dateDir).append(StrKit.SLASH)
                .append(fileName).append("_").append(storageType.getCode())
                .append(DateUtils.format(new Date(), "_HHmmssSSS"))
                .append(StrKit.DOT).append(suffix);
        return sb.toString().replaceAll(" ", "");
    }

    /**
     * @return 基本参数配置
     */
    public abstract AbstractStorageProperties getConfig();

    /**
     * @return 是否启用
     */
    public abstract boolean isEnabled();

    /**
     * 文件上传
     *
     * @param fileByte 文件内容
     * @param fileName 文件名
     * @param suffix   文件后缀
     * @return fileFullPath 文件路径
     */
    public abstract String upload(byte[] fileByte, String fileName, String suffix) throws StorageServiceException;

    /**
     * 文件下载
     *
     * @param fileFullPath 文件路径
     */
    public abstract byte[] download(String fileFullPath) throws StorageServiceException;

    /**
     * 文件删除
     *
     * @param fileFullPath 文件路径
     */
    public abstract void delete(String fileFullPath) throws StorageServiceException;

}
